package com.yanggu.scala.chapater13.partial

object PartialFunDemo02 {

  def main(args: Array[String]): Unit = {
    //使用偏函数
    val list = List(1, 2, 3, 4)
    //定义偏函数
    val value = new PartialFunction[Any, Int] {
      override def isDefinedAt(x: Any): Boolean = {
        println("x = " + x)
        x.isInstanceOf[Int]
      }

      override def apply(v1: Any): Int = {
        println("v1 =" + v1)
        v1.asInstanceOf[Int] + 1
      }
    }

    //这里如果要使用偏函数, 需要使用collect函数
    val list1 = list.collect(value)
    println(list1)

    //偏函数小结
    //使用构建特质的实现类(使用的方式是PartialFunction的匿名子类)
    // PartialFunction 是个特质(看源码)
    // 构建偏函数时，参数形式   [Any, Int]是泛型，第一个表示参数类型，第二个表示返回参数
    //当使用偏函数时，会遍历集合的所有元素，编译器执行流程时先执行isDefinedAt()如果为true ,就会执行 apply, 构建一个新的Int 对象返回
    //执行isDefinedAt() 为false 就过滤掉这个元素，即不构建新的Int对象.
    //map函数不支持偏函数，因为map底层的机制就是所有循环遍历，无法过滤处理原来集合的元素
    //collect函数支持偏函数
  }

}
